package util

// todo 封装jwt的加密和解密
import (
	"encoding/json"
	"github.com/dgrijalva/jwt-go"
	"time"
)

// todo 生成token（加密）
func GenerateToken(k string, d map[string]string) (string, error) {
	data, err := json.Marshal(d)
	if err != nil {
		return "", err
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ // todo 返回的是 jwt内部的Token的结构体
		"iat":  time.Now().Unix(),                       // todo 当前生效的时间
		"exp":  time.Now().Add(time.Minute.Truncate(1)), // todo 结束时间， 设置的一分钟失效
		"data": string(data),
	})
	return token.SignedString([]byte(k))
}

// todo 校验token  进行jwt的校验 (解密)
func AuthCheck(tokenString string, key string) (data map[string]string, err error) {
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		return []byte(key), nil
	})

	if err != nil {
		return nil, err
	}
	//fmt.Println(j.Claims.(jwt.MapClaims)["data"])
	//fmt.Println(j.Claims.(jwt.MapClaims))

	_ = json.Unmarshal([]byte(token.Claims.(jwt.MapClaims)["data"].(string)), &data) // todo 把jwt解析出来的值转成map，这个值就是加密时的 data

	return data, err
}